package br.requisiteworks.modelo.service;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.requisiteworks.modelo.Email;
import br.requisiteworks.modelo.dao.EmailDao;
import br.requisiteworks.util.persistencia.ErroBancoDados;
import br.requisiteworks.util.persistencia.ResultadoVazio;

/**
 * Servico responsavel por executar as operacoes principais do modulo de
 * {@link Email}s
 * 
 * @author Leandro Chaves
 * @version 1, 14/05/2010
 */
@Service
public class EmailService {

    /**
     * Log da classe
     */
    private static final Log log = LogFactory.getLog(EmailService.class);

    @Autowired
    private EmailDao emailDao;

    /**
     * Salva um novo {@link Email} ao repositorio de dados
     * 
     * @param email
     *            o {@link Email} a ser adicionado ao repositorio
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a persistencia do
     *             {@link Email}
     */
    public void salvarEmail(Email email) throws ErroBancoDados {
	this.emailDao.insert(email);
	log.info("Email adicionado com sucesso: " + email);
    }

    /**
     * Atualiza um {@link Email} existente no repositorio de dados
     * 
     * @param email
     *            o {@link Email} a ser atualizado
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a persistencia do
     *             {@link Email}
     */
    public void atualizarEmail(Email email) throws ErroBancoDados {
	this.emailDao.update(email);
	log.info("Email atualizado com sucesso: " + email);
    }

    /**
     * Busca no repositorio por todos os {@link Email}s cadastrados no sistema
     * 
     * @throws ResultadoVazio
     *             Caso nanum {@link Email} seja encontrado
     */
    public List<Email> listarEmails() throws ResultadoVazio {
	return this.emailDao.select();
    }

    /**
     * Busca no repositorio um {@link Email} cujo numero seja igual ao parametro
     * passado
     * 
     * @param numero
     *            O numero de identificacao do {@link Email} no repositorio de
     *            dados
     * @throws ResultadoVazio
     *             Caso um {@link Email} nao seja encontrado
     */
    public Email carregarEmail(int numero) throws ResultadoVazio {
	return this.emailDao.select(numero);
    }

    /**
     * Remove do repositorio o {@link Email} passado pelo parametro
     * 
     * @param email
     *            O {@link Email} que sera removido do repositorio de dados
     * @throws ErroBancoDados
     *             Caso ocorra algum erro durante a transacao
     */
    public void deletaEmail(Email email) throws ErroBancoDados {
	this.emailDao.delete(email);
	log.info("Email apagado com sucesso: " + email);
    }

    public List<Email> procuraNome(String nome) throws ResultadoVazio {
	return this.emailDao.select(nome);
    }
}
